'''
::
    
    ###################按键端口宏##############################
    KEY_ONOFF = 1
    KEY_DOWM = 2
    KEY_UP = 3
    KEY_ENTER = 4
    KEY_SUB = 5
    KEY_ADD = 6
    KEY_SPARE = 7
    
    VerMan_MaxSlave = 1
    VerMan_MaxMaster = 4
    
    ###################外部IO口模式##############################
    INPUT_DIR = 1
    OUTPUT_DIR = 0
    OD_DIR = 2
    ###################外部IO口宏##############################
    LCD_ID1__IO_1 = 0x01
    LCD_ID2__IO_2 = 0x02
    LCD_RST__IO_3 = 0x04
    LCD__IO_4 = 0x08
    LCD__IO_5 = 0x10
    LCD__IO_6 = 0x20
    LCD__IO_7 = 0x40
    LCD__IO_8 = 0x80
    LCD_TP_MISO = 0x0100
    LCD_TP_MOSI = 0x0200
    LCD_TP_SCK = 0x0400
    LCD_TP_CS = 0x0800
    LCD_TP_SDA = 0x1000
    LCD_TP_SCL = 0x2000
    LCD_TP_RST = 0x4000
    LCD_TP_INT = 0x8000
    #内部IO口  做特殊功能使能
    LCD_TXS_OE = 0x010000  # 转换IC使能 默认低 高有效
    LCD_FD_GND__IO_11 = 0x020000
    LCD_CHECK__IO_12  = 0x040000 #防呆接口
    LCD___IO_13       = 0x080000 #
    LCD___IO_14       = 0x100000 #
    ###################复用IO口宏##############################
    # 复用IO名						IO口名		        四线		三线			QSPI		DSPI
    
    # USER_TP_MISO_AF 			LCD_TP_MISO 		  SPI_MISO                    QSPI_IO1    DSPI_IO1
    # USER_TP_MOSI_AF			LCD_TP_MOSI 		  SPI_MOSI   3WIRE_SPI_IO0    QSPI_IO0    DSPI_IO0
    # USER_TP_SCK_AF		    LCD_TP_SCK  		  SPI_SCK    3WIRE_SPI_SCK    QSPI_SCK    DSPI_SCK
    # USER_TP_NSS_AF			LCD_TP_CS   		  SPI_CS     3WIRE_SPI_CS     QSPI_CS     DSPI_CS
    # USER_QSPI_IO0_AF			TP_I2C1_SDA      	  SPI_MOSI   3WIRE_SPI_IO0    QSPI_IO0    DSPI_IO0	
    # USER_QSPI_IO1_AF			TP_I2C1_SCK 	  	  SPI_MISO                    QSPI_IO1    DSPI_IO1
    # USER_QSPI_IO2_AF			LCD_TP_RST   				                      QSPI_IO2	
    # USER_QSPI_IO3_AF			LCD_TP_INT   				                      QSPI_IO3 
    # USER_PWM1_AF			    LCD_ID1__IO_1
    # USER_PWM1_AF				LCD__IO_4
    
    USER_TP_MISO_AF     =     0x01		
    USER_TP_MOSI_AF     =     0x02
    USER_TP_SCK_AF      =     0x04
    USER_TP_NSS_AF      =     0x08
    USER_QSPI_IO0_AF    =     0x10
    USER_QSPI_IO1_AF    =     0x20
    USER_QSPI_IO2_AF    =     0x40
    USER_QSPI_IO3_AF    =     0x80 
    USER_PWM1_AF        =   0x0100
    USER_PWM2_AF        =   0x0200
    
    ###################中断触发模式##############################
    EDGE_DOWN           = 2    #下降沿触发
    EDGE_UP             = 3    #上升沿触发
    
    
    ###################IO口模式##############################
    USER_IO_COMMON		= 0			#普通IO口模式
    USER_IO_AF			= 1			#复用IO口模式
    ###################机子个数##############################
    Master_k2000 = 8
    Slave_MIPI = 4
    Slave_LVDS = 8
    
    ###################FPGA 名称集##############################
    master_dict = {0: "UnKnow", 8: "k2000"}
    Slave_dict = {0: "UnKnow", 240: "No connect", 1: 'K3_EDP', 2: 'K4_EDP', 3: "SSD2832_MIPI", 4: "SDDR32_MIPI",
                  5: "SSD2828_MIPI", 6: "2_PORT_LVDS", 7: "1_PORT_RGB", 8: "4_PORT_LVDS", 9: "8_PORT_VBO",
                  10: "4_PORT_LVDS_VB0"}
    Signal_dict = {0: "UnKnow", 240: "No connect", 1: 'K3_EDP', 2: 'K4_EDP', 3: "SDR CPHY MIPI", 4: "DDR CPHY MIPI",
                   5: "DPHY MIPI", 6: "2_PORT_LVDS", 7: "1_PORT_RGB", 8: "4_PORT_LVDS", 9: "8_PORT_VBO",
                   10: "4_PORT_LVDS_VB0"}
    Slave_FPGA_dict = {0: "UnKnow", 1: "A7_35", 2: "A7_50", 3: "A7_75", 4: "A7_100", 5: "A7_200"}
    
    ###################Bus RS232 波特率宏定义##############################
    BUSRS232_BAUDRATE_9600 = 0X02
    BUSRS232_BAUDRATE_14400 = 0X03
    BUSRS232_BAUDRATE_19200 = 0X04
    BUSRS232_BAUDRATE_38400 = 0X05
    BUSRS232_BAUDRATE_56000 = 0X06
    BUSRS232_BAUDRATE_57600 = 0X07
    BUSRS232_BAUDRATE_115200 = 0X08
    
    ###################数据位宏定义##############################
    BUSRS232_DATABITS_7BIT = 0X00
    BUSRS232_DATABITS_8BIT = 0X01
    
    ###################校验方式宏定义义##############################
    BUSRS232_PARITY_NONE = 0x00
    BUSRS232_PARIYT_EVEN = 0x04
    BUSRS232_PARIYT_ODD = 0x06
    
    ###################停止位宏定义##############################
    BUSRS232_STOPBITS_0_5 = 0x01
    BUSRS232_STOPBITS_1 = 0x00
    BUSRS232_STOPBITS_1_5 = 0x03
    BUSRS232_STOPBITS_2 = 0x02
    
    
    #/* 常用颜色 */
    ARMCMD_BLACK = 0x000000#黑色
    ARMCMD_WHITE = 0xFFFFFF#白色
    ARMCMD_YELLOW = 0xFFFF00#黄色
    ARMCMD_GRAY = 0xC0C0C0#灰色
    ARMCMD_CYAN = 0x00FFFF#青色
    ARMCMD_ORANGE = 0xFF6100#橙色
    ARMCMD_GREEN = 0x00FF00#绿色
    ARMCMD_BROWN = 0x802A2A#棕色
    ARMCMD_RED = 0xFF0000#红色
    ARMCMD_BLUE = 0x0000FF#蓝色
    ARMCMD_PINK = 0xFFC0CB#粉红色
    ARMCMD_POWDER_BLUE = 0xB0E0E6#浅灰蓝色
    ARMCMD_ABAISER = 0x292421#象牙黑
    ARMCMD_BANANA = 0xE3CF57#香蕉色
    ARMCMD_ROYAL_BLUE = 0x4169E1#品蓝色
    ARMCMD_COLD_GRAY = 0x808A87#冷灰色
    ARMCMD_SKY_BLUE = 0x87CEEB#天蓝色
    ARMCMD_GOLDEN_YELLOW = 0xFFD700#金黄色
    ARMCMD_SAFFRON = 0xFF8000#桔黄色
    ARMCMD_BEIGE = 0xA39480#米色
    ARMCMD_IVORY = 0xFAFFF0#象牙白
    ARMCMD_TAWNY = 0xF0E68C#黄褐色
    ARMCMD_ROSE = 0xBC8F8F#玫瑰红
    ARMCMD_SNOW = 0xFFFAFA#雪白色
    ARMCMD_PURPLE = 0xA020F0#紫色
    ARMCMD_LAVENDER = 0xDA70D6#淡紫色
    ARMCMD_SEPIA = 0xD2B48C#棕褐色
    
'''

class str_user_io(object):
    '''    
    IO口 参数配置的类对象
    '''

    def IO_PIN(self):
        '''    
        IO口 pin引脚号
        '''

    def IO_Mode(self):
        '''    
        IO口 pin模式
        '''

class user_IT_io(object):
    '''    
    中断IO口 参数配置的类对象
    '''

    def pin_isr_handler(self,v):
        '''    
        IO口 中断回调
        '''

    def IO_PIN(self): 
        '''    
        IO口 pin引脚号
        '''

    def IO_Enable(self):
        '''    
        IO口 使能
        '''

    def IO_ITMode(self):
        '''    
        IO口 中断触发模式。(上升沿触发和下降沿触发)
        '''

    def IO_ITCycle(self):               #采样周期 单位ms
        '''    
        IO口 采样周期
        '''

class signal_struct(object):                #核心板上的信号类型
    '''    
    核心板上的信号板的类对象，此对象嵌套slave_struct上 不用单独调用
    '''

    def signal_type(self):
        '''    
        核心板上的信号类型
        '''

    def signal_Version(self):
        '''    
        核心板上的信号板版本号
        '''

class slave_struct(object):             #FPGA从机 核心板上的FPGA
    '''    
    核心板的类对象，此对象嵌套master_struct上 不用单独调用
    '''

    def slave_type(self):
        '''    
        核心板上的GPU板类型()
        '''

    def slave_Version(self):
        '''    
        核心板上的GPU板版本号()
        '''

    def signal(self):  # 类嵌套
        '''    
        核心板上的GPU板对应的信号板。
        '''

class master_struct(object):            #FPGA主机 主控板上的FPGA
    '''    
    主控板GPU的类对象
    '''

    def type(self):
        '''    
        主控板GPU类型
        '''

    def FPGA_Type(self):
        '''    
        主控板GPU的信号类型
        '''

    def Version(self):
        '''    
        主控板GPU的版本号
        '''

    def slave(self):  # 类嵌套
        '''    
        核心板信息
        '''

def MAIN_GetVersion():
    '''
    获取主控板版本

    * 参数  : 无

    * 返回  
        * 主控板版本 以字符串形式输出

    * raise  :   无
    '''

def DEBUG(fmt):
    '''
    打印输出语句

    * 参数  
        * fmt : 与printf相同,格式: DEBUG("test: %d, %d" %(a, b))

    * 返回  : 无

    * raise  :   无

    '''

def VerMan_GetMasterBoardTotal():
    '''
    获取板子总数

    * 参数  : 无

    * 返回  : 无

    * raise  :   无
    '''

def VerMan_MasterAllEnable():
    '''
    使能的所有Master(Master一般是指带GPU的板子)

    * 参数  : 无

    * 返回  : 无

    * raise  :   无
    '''

def VerMan_MasterSlaveAllEnable():
    '''
    使能所有Master(Master一般是指带GPU的板子)
    使能所有Slave(Slave是指Master(GPU)下的器件(比如2832))

    * 参数  : 无

    * 返回  : 无

    * raise  :   无
    '''

def VerMan_MasterIndexEnable(index):
    '''
    使能单个Master(Master一般是指带GPU的板子)信号盒。

    * 参数 
        * index : 信号盒ID   0-信号盒0,1-信号盒1,2-信号盒2,3-信号盒3

    * 返回  : 无

    * raise  :   无
    '''


# '''
# * 函数名: Get_APB_Adapter
# * 描述  : 无
# * 参数  : 无
# * 返回  :  0:表示ok   其他表示异常
# *注意   : 用户不需要调用
# '''


# '''
# * 函数名: Get_Multi_Adapter
# * 描述  : 无
# * 参数  : 无
# * 返回  :  0:表示ok   其他表示异常
# *注意   : 用户不需要调用
# '''

def Delay_ms(ms):
    '''
    延时毫秒函数

    * 参数  
        * ms: 毫秒

    * 返回  : 无

    * raise  :   无
    '''

def Delay_us(us):
    '''
    延时微秒函数

    * 参数  
        * us: 微秒

    * 返回  : 无

    '''

def MeasureTimeStart_ms():
    '''
    获取初始时间,开始测量时间

    * 参数  : 无

    * 返回  
        * 当前时间计算值,单位ms

    '''

def GetMeasureTime_ms(ts):
    '''
    获取调用 MeasureTimeStart_ms() 函数时到现在时间长度

    * 参数  
        * ts : 是初始时间,就是调用 MeasureTimeStart_ms() 函数时的返回值,本函数要根据这个根据这个初始时间来计算时间差

    * 返回 
        * 调用 MeasureTimeStart_ms() 函数时到现在时间长度,单位ms

    '''

def SDCard_BIN(file_name):
    '''
    加载SD卡 二进制(BIN)图像

    * 参数  
        * file_name : 图像文件名（可包含文件夹目录名），支持长英文名

    * 返回   : 无

    '''

def SDCard_Init():
    '''
    SD卡初始化

    *参数   : 无

    *返回   
        * <0 失败 
        * >=0 成功  

    '''

def SDCard_BMP(file_name):
    '''
    加载SD卡 BMP格式图片, 必须是24位真彩色图片

    * 参数
        * file_name : 图像文件名（可包含文件夹目录名），支持长英文名

    * 返回 : 无
    '''

def SDCard_Printf(file_name, fmt):
    '''
    向文件中写入字符串，若无文件则新建

    * 参数 
        * path : 文件路径  fmt与printf相同

    * 返回   
        * 负数为错误代码  其他为写入文件的数据长度

    '''

def SDCard_PrintfHead(file_name, fmt):
    '''
    新建一个文件并向文件中写入头部信息，若文件已存在则退出

    * 参数   
        * path 文件路径  fmt与printf相同

    * 返回  
        * 负数为错误代码 -1代表文件已存在  其他为写入文件的数据长度

    '''

def SDCard_CurrBMP(file_name):
    '''
    读取当前SD的图片,不记入总缓存

    * 参数
        * file_name - 图像文件名（可包含文件夹目录名），支持长英文名

    * 返回   : 无
    '''


# '''
# *函数名 : Busk2000tokey_Init
# *描述   : 按键盒初始化
# *参数   : 无
# *返回   : 无
# *注意   : 用户不需要调用
# '''

def Get_keyVersion():
    '''
    获取按键盒的软硬件版本号

    * 参数  : 无

    * 返回  
        * =0 成功
        * <0 失败 
    '''

def read_key_press(before_time):
    '''
    读取按键盒按键按下
    
    * 参数 
        * before_time : 往前时间(ms) 从发起请求到往前before_time时间内是否有动作

    * 返回 
        * key_str 		  存放获取到的内容
        * key_str_len  key_str长度(不能超过256)

    * PS		: key_str会接收到的内容:
                1.NO_KEY_ACTION 	  (无动作)
                2.KEY1_PRESS (按键1按下)
                3.KEY2_PRESS (按键2按下)
                4.KEY3_PRESS (按键3按下)
                5.KEY4_PRESS (按键4按下)
                6.KEY5_PRESS (按键5按下)
                7.KEY6_PRESS (按键6按下)
                8.KEY7_PRESS (按键7按下)
                有多个按键动作会返回多个按键动作，以逗号(,)分隔
    * 例子	 : read_key_press(500);
    '''

def read_key_lift(before_time):
    '''
    读取按键盒按键抬起

    * 参数  
        * before_time : 往前时间(ms) 从发起请求到往前before_time时间内是否有动作

    * 返回  
        * key_str 		  存放获取到的内容  字符串长度为256

    * PS		 : key_str会接收到的内容:
                    1.no_key_action  (无动作)
                    2.key_onoff_lift (OFF按键抬起/释放)
                    3.key_down_lift  (下翻按键抬起/释放)
                    4.key_up_lift    (上翻按键抬起/释放)
                    5.key_enter_lift (确认按键抬起/释放)
                    6.key_sub_lift   (减 按键抬起/释放)
                    7.key_add_lift   (加 按键抬起/释放)
                    8.key_spare_lift (备用按键抬起/释放)
                    有多个按键动作会返回多个按键动作，以逗号(,)分隔
    * 例子	 : read_key_lift(500);
    '''

def read_key_Long_press(before_time):
    '''
    读取按键盒按键长按

    * 参数 
        * before_time : 往前时间(ms) 从发起请求到往前before_time时间内是否有动作

    * 返回  
        * key_str 		  存放获取到的内容  字符串长度为256

    * PS		 : key_str会接收到的内容:
                    1.no_key_action 	    (无动作)
                    2.key_onoff_long_press (ON/OFF按键长按)
                    3.key_down_long_press	(下翻按键长按)
                    4.key_up_long_press	(上翻按键长按)
                    5.key_enter_long_press (确认按键长按)
                    6.key_sub_long_press	(减 按键长按)
                    7.key_add_long_press   (加 按键长按)
                    8.key_spare_long_press (备用按键长按)
                    有多个按键动作会返回多个按键动作，以逗号(,)分隔
    * 例子	 : read_key_press(500);
    '''

def read_key_continuous_long_press(before_time):
    '''
    读取按键盒按键连续长按，按键未抬起会一直返回长按

    * 参数  
        * before_time : 往前时间(ms) 从发起请求到往前before_time时间内是否有动作

    * 返回  
        * key_str 		  存放获取到的内容  字符串长度为256

    * PS		 : key_str会接收到的内容:
                    1.no_key_action 	    (无动作)
                    2.key_onoff_long_press (ON/OFF按键长按)
                    3.key_down_long_press	(下翻按键长按)
                    4.key_up_long_press	(上翻按键长按)
                    5.key_enter_long_press (确认按键长按)
                    6.key_sub_long_press	(减 按键长按)
                    7.key_add_long_press   (加 按键长按)
                    8.key_spare_long_press (备用按键长按)
                    有多个按键动作会返回多个按键动作，以逗号(,)分隔
    * 例子	 : read_key_press(500);
    '''

def read_bus_encoder(before_time):
    '''
    读取按键盒旋转编码器的动作
    * 参数  
        * before_time :  往前时间(ms) 从发起请求到往前before_time时间内是否有动作

    * 返回  
        * key_str 		  存放获取到的内容  字符串长度为256
    * PS		 : key_str会接收到的内容:
                    1.NO_EC_ACTION 	(无动作)
                    2.EC_CW_x      	(顺时针转动)
                    3.EC_CCW_x				(逆时针转动)
                    4.EC_PRESS_CW_x	(按下顺时针转动)
                    5.EC_PRESS_CCW_x (按下逆时针转动)
                    6.EC_PRESS				(短按)
                    7.EC_LOING_PRESS (长按)
                    后面的 _x 为旋转次数
    * 例子	 : read_key_press(500);
    '''

def key_SetLed(KEYx, OnOff):
    '''
    设置按键的LED

    * 参数 KEYx  : key_onoff,key_down,key_up,key_enter,key_sub,key_add,key_spare
    * 参数 OnOff : 0-关闭   1-开启

    * 返回  : =0 成功，<0 失败 
    '''

def Key_GetRP_Val():
    '''
    读取电位器
    * 参数  
        * 无

    * 返回  
        * ret 	读取成功标志位
        * val   读到的电位器值
    '''

def Key_SetRP_subdivision(MaxVal):
    '''
    设置电位器细分量，旋钮最大值
    * 参数  
        * 无
    * 返回  
        * ret 	读取成功标志位
    '''

def Key_SetEncoder_rate(speed):
    '''
    设置数字编码器速率

    * 参数 speed:  : 速率，旋转时会乘上这个倍数，为0(默认值)不启用

    * 返回  : =0 成功，<0 失败 
    '''

def UserIO_Init():
    '''
    IO基本初始化

    * 参数   : 无

    * 返回   : 0:表示硬件ok

    * 注意   : 用户不需要调用

    '''

def UserIO_Conf(User_conf):
    '''
    配置外接IO参数

    * 参数   : 
        * User_conf : str_user_io参数可以看对应结构体

    * 返回   : 无

    * 注意   : 无

    '''

def UserIO_ITConf(User_conf):
    '''
    配置中断IO参数

    * 参数  
        * User_conf : str_user_io参数可以看对应结构体

    * 返回   : 无

    * 示例   ：
        def isr_test(index,pin):    #index 主机号  pin中断IO
            print('isr_test')
            if pin == LCD_TP_SCL:
                print('pin LCD_TP_SCL')
            if pin == LCD_TP_INT:
                print('pin LCD_TP_INT')
            if pin == LCD__IO_6:
                print('pin LCD__IO_6')
            if pin == LCD__IO_5:
                print('pin LCD__IO_5')
            if pin == LCD_TP_MISO:
                print('pin LCD_TP_MISO')
            if pin == LCD_TP_SDA:
                print('pin LCD_TP_SDA')
            print(index)
            print(pin)
                
        def isr_test1(index,pin):    #index 主机号  pin中断IO
            print('isr_test1')
            if pin == LCD_TP_MISO:
                print('pin LCD_TP_MISO')
            if pin == LCD_TP_SDA:
                print('pin LCD_TP_SDA')
            print(index)
            print(pin)  

            IT_io = user_IT_io()
            IT_io1 = user_IT_io()
            user_io.IO_PIN=LCD_TP_MISO|LCD_TP_SDA|LCD_TP_SCL|LCD_TP_INT|LCD__IO_5|LCD__IO_6
            user_io.IO_Mode=INPUT_DIR
            UserIO_Conf(user_io)
            
            IT_io.IO_PIN=LCD_TP_SCL|LCD_TP_INT|LCD__IO_5
            IT_io.IO_Enable=1
            IT_io.IO_ITMode=EDGE_UP    #上升沿触发
            IT_io.IO_ITCycle = 80
            IT_io.handler = isr_test   #中断回调
            UserIO_ITConf(IT_io)
            
            IT_io1.IO_PIN=LCD__IO_6|LCD_TP_MISO|LCD_TP_SDA
            IT_io1.IO_Enable=1
            IT_io1.IO_ITMode=EDGE_UP    #上升沿触发
            IT_io1.handler = isr_test1   #中断回调
            UserIO_ITConf(IT_io1)
    '''

def UserIO_DirBit(IO_PIN, val):
    '''
    配置IO口为OD模式

    * 参数   
        * IO_PIN : PIN引脚号
        * val : 输入输出状态

    * 返回   : 无

    * 注意   : 无
    '''

def UserIO_BitSet(IO_PIN):
    '''
    拉高IO口

    * 参数 
        * IO_PIN: PIN引脚号
    
    * 返回   : 无
    * 注意   : 无
    '''

def UserIO_BitReset(IO_PIN):
    '''
    拉低IO口

    * 参数 
        * IO_PIN: PIN引脚号

    * 返回   : 无

    * 注意   : 无
    '''

def UserIO_GetBit(IO_PIN):
    '''
    读取IO口状态

    * 参数 
        * IO_PIN: PIN引脚号

    * 返回   : 无

    * 注意   : 无
    
    '''

def UserIO_AF_Set(IO_PIN,AF_MODE):
    '''
    配置IO复用

    * 参数  
        * IO_PIN  ： 需要复用的IO口(使用复用IO口宏)
        * AF_MODE ： 复用的模式(使用IO口模式宏)

    *返回   : 无

    *注意   : 无
    
    '''

def User_IOAF_ALLOFF():
    '''
    关闭所有IO口复用

    * 参数   :无

    * 返回   : 无

    * 注意   : 无
    '''

def User_IT_Init():
    '''
    中断使能初始化

    * 参数   : 无

    * 返回   : 无

    * 注意   : 无

    '''

def Get_IP():
    '''
    获取网口IP

    * 参数   : 无

    * 返回   
        * ret 成功或失败标志位  
        * IP 获取到的IP(字符串格式)

    * 示例   : ret,ip = Get_IP()              
            if ret>=0:
                print(ip)
    '''

def Set_IP(IP):
    '''
    设置网口IP

    * 参数   
        * IP : 字符串传入

    * 返回  
        * >=0 : OK  
        * -1 : NG

    * 注意   : 无

    * 示例   ：Set_IP("192.111.1.1")
    '''

def Get_PN():
    '''
    获取PN

    * 参数   : 无

    * 返回   
        * ret : 成功或失败标志位 
        * PN : 获取到的PN(字符串格式)

    * 示例   : ret,PN = Get_PN()        
            if ret>=0:
                print(PN)
    '''

def Set_PN(PN):
    '''
    设置PN

    *参数   : PN 

    *返回   : 
        * >=0 : OK  
        * -1 : NG

    *注意   : 无

    *示例   ：Set_PN(1)
    '''

def Multi_BusRS232_init(**kwargs):
    '''         
    初始化Bus转RS232模块

    * 参数  
        * kwargs 可变参数

    * 返回 
        * Tsky_comDriver 设备类

    * 说  明:  id(id号 必须要传 1号设备-1 2号设备-2)
            baudrate(波特率 可以不传要传就传上面的宏) 
            bits(数据位 可以不传要传就传上面的宏)
            parity(校验位 可以不传要传就传上面的宏)
            stop(停止位 可以不传要传就传上面的宏)
    * 示例：        
    '''

def GetLockCode():
    '''
    获取唯一ID

    *参数   : 无

    *返回   
        * 唯一ID的二进制流

    *注意   : 无

    *示例   ：
    '''

def Reset_Run(Reset_Run_Flag):
    '''         
    中断复位函数

    * 参数  
        * Reset_Run_Flag: 中断复位使能

    * 返回  : 无

    * 说  明:  在热拔插中断里调用

    * 示例：        
    '''

def Test_Reast():
    '''        
    * 函数名: Test_Reast
    * 描述  : 软件复位
    * 参数  : 无
    * 返回  : 无
    * 说  明:  调试使用
    * 示例：        
    '''

def traceback_exception(e):
    '''
    * 函数名: traceback_exception
    * 描述  : 生成异常信息
    * 参数  
        * e--异常类型
    * 返回 
        * 异常字符串
    * 说  明:  
    * 示例：        
    '''

class Key_Device(object):
    '''√
        按键盒模块类

        * 参数 : 
            
        * 返回 :  
            *
        * 注意 : 
            不用实例化
        * raise  :   无            
    '''

 

    def read_key_press(cls,before_time:int):
        '''
        读取按键盒按键按下
        
        * 参数 
            * before_time : 往前时间(ms) 从发起请求到往前before_time时间内是否有动作

        * 返回 
            * key_str 		  存放获取到的内容
            * key_str_len  key_str长度(不能超过256)

        * PS		: key_str会接收到的内容:
                    1.NO_KEY_ACTION 	  (无动作)
                    2.KEY1_PRESS (按键1按下)
                    3.KEY2_PRESS (按键2按下)
                    4.KEY3_PRESS (按键3按下)
                    5.KEY4_PRESS (按键4按下)
                    6.KEY5_PRESS (按键5按下)
                    7.KEY6_PRESS (按键6按下)
                    8.KEY7_PRESS (按键7按下)
                    有多个按键动作会返回多个按键动作，以逗号(,)分隔
        * 例子	 : read_key_press(500);
        '''

    def read_key_lift(cls,before_time:int):
        '''
        读取按键盒按键抬起

        * 参数  
            * before_time : 往前时间(ms) 从发起请求到往前before_time时间内是否有动作

        * 返回  
            * key_str 		  存放获取到的内容  字符串长度为256

        * PS		 : key_str会接收到的内容:
                        1.no_key_action  (无动作)
                        2.key_onoff_lift (OFF按键抬起/释放)
                        3.key_down_lift  (下翻按键抬起/释放)
                        4.key_up_lift    (上翻按键抬起/释放)
                        5.key_enter_lift (确认按键抬起/释放)
                        6.key_sub_lift   (减 按键抬起/释放)
                        7.key_add_lift   (加 按键抬起/释放)
                        8.key_spare_lift (备用按键抬起/释放)
                        有多个按键动作会返回多个按键动作，以逗号(,)分隔
        * 例子	 : read_key_lift(500);
        '''

    def read_key_Long_press(cls,before_time:int):
        '''
        读取按键盒按键长按

        * 参数 
            * before_time : 往前时间(ms) 从发起请求到往前before_time时间内是否有动作

        * 返回  
            * key_str 		  存放获取到的内容  字符串长度为256

        * PS		 : key_str会接收到的内容:
                        1.no_key_action 	    (无动作)
                        2.key_onoff_long_press (ON/OFF按键长按)
                        3.key_down_long_press	(下翻按键长按)
                        4.key_up_long_press	(上翻按键长按)
                        5.key_enter_long_press (确认按键长按)
                        6.key_sub_long_press	(减 按键长按)
                        7.key_add_long_press   (加 按键长按)
                        8.key_spare_long_press (备用按键长按)
                        有多个按键动作会返回多个按键动作，以逗号(,)分隔
        * 例子	 : read_key_press(500);
        '''

    def read_key_continuous_long_press(cls,before_time:int):
        '''
        读取按键盒按键连续长按，按键未抬起会一直返回长按

        * 参数  
            * before_time : 往前时间(ms) 从发起请求到往前before_time时间内是否有动作

        * 返回  
            * key_str 		  存放获取到的内容  字符串长度为256

        * PS		 : key_str会接收到的内容:
                        1.no_key_action 	    (无动作)
                        2.key_onoff_long_press (ON/OFF按键长按)
                        3.key_down_long_press	(下翻按键长按)
                        4.key_up_long_press	(上翻按键长按)
                        5.key_enter_long_press (确认按键长按)
                        6.key_sub_long_press	(减 按键长按)
                        7.key_add_long_press   (加 按键长按)
                        8.key_spare_long_press (备用按键长按)
                        有多个按键动作会返回多个按键动作，以逗号(,)分隔
        * 例子	 : read_key_press(500);
        '''

    def read_bus_encoder(cls,before_time:int):
        '''
        读取按键盒旋转编码器的动作
        * 参数  
            * before_time :  往前时间(ms) 从发起请求到往前before_time时间内是否有动作

        * 返回  
            * key_str 		  存放获取到的内容  字符串长度为256
        * PS		 : key_str会接收到的内容:
                        1.NO_EC_ACTION 	(无动作)
                        2.EC_CW_x      	(顺时针转动)
                        3.EC_CCW_x				(逆时针转动)
                        4.EC_PRESS_CW_x	(按下顺时针转动)
                        5.EC_PRESS_CCW_x (按下逆时针转动)
                        6.EC_PRESS				(短按)
                        7.EC_LOING_PRESS (长按)
                        后面的 _x 为旋转次数
        * 例子	 : read_key_press(500);
        '''

    def key_SetLed(cls,KEYx:int, OnOff:int):
        '''
        设置按键的LED

        * 参数 KEYx  : key_onoff,key_down,key_up,key_enter,key_sub,key_add,key_spare
        * 参数 OnOff : 0-关闭   1-开启

        * 返回  : =0 成功，<0 失败 
        '''

    def Key_GetRP_Val(cls):
        '''
        读取电位器
        * 参数  
            * 无

        * 返回  
            * ret 	读取成功标志位
            * val   读到的电位器值
        '''

    def Key_SetRP_subdivision(cls,MaxVal):
        '''
        设置电位器细分量，旋钮最大值
        * 参数  
            * 无
        * 返回  
            * ret 	读取成功标志位
        '''

    def Key_SetEncoder_rate(cls,speed):
        '''
        设置数字编码器速率

        * 参数 speed:  : 速率，旋转时会乘上这个倍数，为0(默认值)不启用

        * 返回  : =0 成功，<0 失败 
        '''

class Pin_Device(object):
    '''√
    pin模块类

    * 参数 : 
        
    * 返回 :  
        *
    * 注意 : 
        需要实例化
    * raise  :   无            
    '''


    def DEBUG(cls,fmt):
        '''
        打印输出语句

        * 参数  
            * fmt : 与printf相同,格式: DEBUG("test: %d, %d" %(a, b))

        * 返回  : 无

        * raise  :   无

        '''

    def SDCard_Detection(cls): 
        '''
        检测SD卡是否在线

        *参数   : 无

        *返回   
            * <0 失败 
            * >=0 成功  

        '''

    def SDCard_Printf(cls,file_name, fmt):
        '''
        向文件中写入字符串，若无文件则新建

        * 参数 
            * path : 文件路径  fmt与printf相同

        * 返回   
            * 负数为错误代码  其他为写入文件的数据长度

        '''

    def SDCard_PrintfHead(cls,file_name, fmt):
        '''
        新建一个文件并向文件中写入头部信息，若文件已存在则退出

        * 参数   
            * path 文件路径  fmt与printf相同

        * 返回  
            * 负数为错误代码 -1代表文件已存在  其他为写入文件的数据长度

        '''

    def traceback_exception(cls,e):
        '''        
        * 函数名: traceback_exception
        * 描述  : 生成异常信息
        * 参数  : 
            * e--异常类型
        * 返回  
            * 异常字符串
        * 说  明:  
        * 示例：        
        '''

    def traceback_exce_driver(cls):
        '''        
        * 函数名: traceback_exce_driver
        * 描述  : 追溯底层报错信息
        * 参数  : 

        * 返回  
            * 异常字符串
        * 说  明:  
        * 示例：        
        '''

    def traceback_clear_exce(cls):
        '''        
        * 函数名: traceback_clear_exce
        * 描述  : 清除底层报错信息
        * 参数  : 

        * 返回  
            * 异常字符串
        * 说  明:  
        * 示例：        
        '''

